CircleCIで例外発生時にon_fail判定でSlackへ手軽に通知できるようにしてみた
はじめに
CircleCIワークフローが例外の発生で中断した時、Slack等へメッセージを加工しつつ通知しておきたい時がありますが、今回利用したSlack OrbはWorkSpaceやBASH_ENVの評価に対応していませんでした。代わりにrun
でcurlを用いてWEBHOOKから通知させてみました。
Slackへ通知するスクリプト
なるだけ固定値を書き込まず、色々な状況下で使いまわしが効くことを前提としてみました。
post_slack.sh
#!/bin/sh SLACK_WEB_HOOK=$1 MESSAGE=$2 PAYLOAD=$(echo "{}" | jq ".text = \"${MESSAGE}\"") echo $MESSAGE curl -XPOST --data-urlencode "payload=${PAYLOAD}" ${SLACK_WEB_HOOK}
payload用のJSONデータは、直接記述すると各記号のエスケープが手間となるため、jqを用いた要素設定としています。
ワークフローからの呼び出し
${SLACK_WEBHOOK}
については、Slack orbを利用中であれば設定が済んでいるはずです。この例は単純な通知だけにしていますが、必要に応じて値をWorkSpaceあるいはBASH_ENVを経由して通知させることも可能です。
- run: command: | exit 1 - run: name: image_exist_check when: on_fail command: | sh ./post_slack.sh ${SLACK_WEBHOOK} "master_${CIRCLE_SHA1:0:7} tags Image not found"
あとがき
知識としては判っていたものの、Orbを利用する場合は担保している範囲を正確に把握しておくべきであると実感しました。
WorkSpaceあるいはBASH_ENVを経由して状況に応じたデータを渡すことができますが、Orbによってはそれらの評価を行わないものがあります。処理の組み合わせが必要でない等、あくまでもそれ単体で完結するケースに留めておいたほうが手戻りもすくなくなるはずです。